『Masterminds of Programming』
https://gyazo.com/a9652682e55a9bd71b516562f904d55d
出版日: 2009/4/6
めっちゃくちゃ好きな本mrsekut.icon*5
プログラミング言語開発者たちへのインタビュー本
ただ、ちょっと古い
セカンドシーズン出して欲しい
Rust, Go, Swift, Kotlin, Scala, TypeScript, Julia, Elixir, Elm, Nim....
ソフトウェアプロジェクトの依存関係上、プログラミング言語は最下流
言語の実装は変更しづらい
互換性とか
言語の設計はアジャイル開発ができない
言語定義中のバグは、人が増えるまで見つからない
変更しづらいので時すでに遅し感
設計が大事
誰かが「この機能入れてくれ」って言ってきた時
1段階目、「こんなふうに2,3行書けば同じことができるよ」
2段階目、「こんなふうに抽象化すれば、外部モジュールとして利用できるよ」
つまり、言語本体の実装には追加しない
3段階目、良いアイディアだから標準ライブラリとして入れてみるか
Pythonのみで無理なら、C言語による拡張機能として頑張る
とりあえず「No」と答える
相手は、諦めるか、言語の変更なしに自分で解決するか
webというドメインでのみ良い機能でも、それだけで機能を追加すべきでない
メジャーバージョンリリース
リリースのタイミングは最初はGuido van Rossum.iconの気まぐれだった
ユーザーから、大きめのリリースは少なくとも一定期間(18ヶ月)開けてくれと言われた
数値を従来のようにハードウェアに扱わせるのではなく、任意精度の整数として扱わせるという選択について
任意精度の有理数を扱える
有理数が好きじゃなかったので整数にした
Pythonには32bit系(int)と、別途用意された任意精度系(long)がある
後者は,CのGNU MPや、JavaのBignumなどのライブラリで実現してる 最初は、数値に'L'を付けて区別する文法だった
面倒になったので、Python2.2から自動で変換されるようになった
Python3からは数値型は1つになった
大胆らしい
intという名前
以前のlongのことをintと呼んでる
なぜマルチパラダイムをサポートしたのか
実はマルチパラダイムではない
基本的なデータ型はすべてオブジェクト
関数型言語っぽい機能もあるが、サポートしているわけではない
lambda, map, filterなど
開発時のペルソナ
Unix環境やそれに類似する環境を用いて仕事をするプログラマ
PythonはC言語とシェルプログラミングの架け橋となる」というスローガンを用いてた
アプリケーション内に組み込んで使う人が現れるまで、そういう用途で使われると思ってなかった
中高等教育、大学、独学でプログラミングの原理について学ぶのに適している、というのは偶然
優秀なプログラマの見極め方、雇用の話
手っ取り早く書けるのがいい
プロトタイプと最終的なプリケーションの境目などない
動的言語のよさ
大きな問題空間や、解決空間を模索してるとき、解決策への道筋がまだ明確でない時に最も有益になる
tsのany最強では?mrsekut.icon
大量のコードを記述することなく、何度も実験を繰り返すことができる
前回のアプローチに縛られることなく、前の実験で学んだことを活かせる
これが機械学習とかに向いている所以なのかmrsekut.icon
Q. 「言語を格闘する」というのはどういう意味ですか?
Guido「それは大抵の場合、プログラマが他の言語でやっていたことを習慣的に続けようとするために起こります」
例えば、Pythonのselfをなんとかしてなくしたい、という要望とか
これは共感mrsekut.icon
その言語独自の思想に乗っかってみるのが楽しい
Goにgenerics入れろ議論とかも同じだよな
ABCの主要開発者のLambert MeertensはALGOL 68に影響を受けた Pythonでリストのリストを作れたりするのは↑こういったものの影響
Python 3000
シンプルなパーサが優れている
複雑なものが人が読むのも、別のモパーサーを作るときも大変
Ptyhonはシンタックスレベルでは解析が簡単
parserは自動生成
scannerは手で開発
pythonのlexerはスタックを用いて、indentを読み込んでいる
つまり、parserとlexerが完全に独立しているわけではない #?? マクロによって全ての問題が解決するとは思ってない
というか、あんまり興味がない
C言語の中括弧どこに置くか問題という不毛な議論を解消できると考えた
中括弧を用いると些細なバグが潜みやすい
pp.37-38が地味に理解できないmrsekut.icon
起動時間の問題はPyPyのアプローチが正しいと思っている
何の起動時間?mrsekut.icon
言語に複数の実装があることは、言語の仕様の曖昧さを除去する上でとても有益だった
例えば特殊なケースに遭遇したり、テストをしたり、疑問を投げかけたりしてくれる
プログラミングを中断するとき、最後にカーソルが合ったところに「HIRO」って書いてる
なので、次に再開する時に、何を作業していたかがわかる
関数の引数はせいぜい2,3個まで
特に同じ型の筆記数が複数個連続すると、入れ替わった時に気付けない
これはインターフェースやAPIを作る時に気をつけること
フラグを使うなら、フラグごとのメソッドをつくったほうがいい
新しいオブジェクトを生成して返すのか、既存のオブジェクトに変更を加えて返すのかがわからないようなAPIを作ってはいけない
pythonのsort()が値を返さないのはこのため。
sorted()は新たに生成されたリストを返す
キーボードはパワフルな入力機器であり、マウスはすべての入力機器の中で最も遅い
システムはユーザーによって拡張できないといけない
後方互換性についての話
2から3へ自動変換するもの
3で実行した時に2のコードが有ると、警告を出力し、3の特定の機能を2.6にバックポーティングする
1990年に最初のレポート
1998年に標準が採用
Haskellの歴史に関する論文
あまり広く知られていない機能
現実に存在しているアルシュの問題を解決するもので、コレよりも優れた解決策が見つかってないので、未だに存在する
副作用がないことで、状態を考えずに済む
値だけを考えればよい
Haskellでもunsafe接頭辞のライブラリ名の関数を使うと副作用が入る
関数型プログラミングのデバッグ
データ依存性に基づくデバッガ
コード片を目で見る
Haskellの持つ特徴が他の言語に及ぼした例
ラムダ式
Python, JS, Perlなどなど多数
リスト内包表記
Python, C#, Scalaなどなど
Haskell発祥ではないが、普及に貢献した
Javaのジェネリックなど
Scala
その他影響を与えた言語
「我々は正しいことを行わければならいのです。例え主流の座を獲得していなかったとしても、主流に影響を与えてきているのですから」Paul Hudak.icon
関数型言語は言語そのものを簡単に拡張できる
遅延評価によって、時間を空間に変化させてしまえる
逐次的に値を調達する方法(時間)を考えるのではなく
すべての値を保持したリスト(空間)を考えることができる
後者のほうが簡単
どんな言語か
デバイスから独立した表現
ページ内容を記述
スタック指向
インタプリタ型
画像、グラフィック、フォントのレンダリングに関するオペレータを備えている
データ構造としてではなくプログラミング言語として実装したことで、初期では予期していなかった使い方を新しく拡張することも容易になった
PostScriptは基本的なオペレータさえも再定義できる
やりたいことをすべてできる
スタックベースの言語は実装が簡単、改正機と実行も速い